package com.optimus.db.dao.impl;

import com.optimus.common.cvo.PuntosMapaCVO;
import com.optimus.common.cvo.PuntosMapaCVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.util.ConstantesDB;
import com.optimus.common.vo.BaseVO;
import com.optimus.common.vo.PuntosMapaVO;
import com.optimus.common.vo.ResultadoVO;
import com.optimus.db.QueryFactory;
import com.optimus.db.dao.PuntosMapaDAO;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author victor
 */
public class PuntosMapaDAOImpl extends BaseDAO implements PuntosMapaDAO {
    private static  Logger logger = LoggerFactory.getLogger(PuntosMapaDAOImpl.class);

    public PuntosMapaCVOList listar(PuntosMapaVO puntosMapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        PuntosMapaCVOList result = new PuntosMapaCVOList();
        Long tk = puntosMapaVO.getTicket();
        result.setLista( new ArrayList<PuntosMapaCVO>() );
        result.setTicket(tk);

        PuntosMapaCVO item = null;
        try {
            logParams[0] =tk;
            String queryStr=QueryFactory.instance().query("puntosmapa_listar", puntosMapaVO.getTicket());
            logParams[1] = queryStr;
            checkSession();
            session.beginTransaction();
            SQLQuery query = session.createSQLQuery(queryStr);
            query.setInteger("idmapa", puntosMapaVO.getIdMapa());
            Object objList = query.list();
            Object[] itemObj = null;

            for (Object obj : (List) objList) {
                itemObj = (Object[]) obj;
                item = new PuntosMapaCVO();
                item.setItem(getInteger(itemObj[0], null, tk));
                item.setIdMapa(getInteger(itemObj[1], null, tk));
                item.setIdElementoPublicitario(getInteger(itemObj[2], null, tk));
                item.setLatitud(getBigDecimal(itemObj[3], null, tk));
                item.setLongitud(getBigDecimal(itemObj[4], null, tk));
                item.setOrden(getInteger(itemObj[5], null, tk));
                item.setT(getString(itemObj[6], null, tk));
                item.setTipoPunto(getString(itemObj[7], null, tk));
                item.setFechaCreacion(getDate(itemObj[8], null, tk));
                item.setIdUsuario(getString(itemObj[9], null, tk));
                item.setDireccion(getString(itemObj[10], null, tk));
                result.getLista().add(item);
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("ticket={} sql={} ", logParams);
        }
        return result;
    }

    public ResultadoVO insertar(PuntosMapaVO puntosMapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        Long tk = puntosMapaVO.getTicket();
        ResultadoVO resultadoVO = new ResultadoVO();
        resultadoVO.setTicket(tk);
        Session session_db=null;
        try {
            String queryStr=QueryFactory.instance().query("puntosmapa_insertar", puntosMapaVO.getTicket());
            logParams[0] = queryStr;
            session_db = session();
            session_db.beginTransaction();

            
            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("item", puntosMapaVO.getItem());
            query.setInteger("idmapa", puntosMapaVO.getIdMapa());
            query.setInteger("idelementopublicitario", puntosMapaVO.getIdElementoPublicitario());
            query.setBigDecimal("latitud", puntosMapaVO.getLatitud());
            query.setBigDecimal("longitud", puntosMapaVO.getLongitud());
            query.setInteger("orden", puntosMapaVO.getOrden());
            query.setString("t", puntosMapaVO.getT());
            query.setString("tipopunto", puntosMapaVO.getTipoPunto());
            query.setDate("fechacreacion", puntosMapaVO.getFechaCreacion());
            query.setString("idusuario", puntosMapaVO.getIdUsuario());

            logger.debug("Tiket={} Antes de ejecutar query", new Object[]{tk} );
            int intResult = query.executeUpdate();
            session_db.getTransaction().commit();
            resultadoVO.setCodigo(ConstantesDB.STATUS_OK);
        } catch (Exception e) {
            if(session_db!=null){
                session_db.getTransaction().rollback();
            }
            resultadoVO.setCodigo(ConstantesDB.STATUS_FAIL);
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return resultadoVO;
    }

    public BaseVO eliminar(PuntosMapaVO puntosMapaVO) throws ApplicationException {
        Object[] logParams = new Object[3];
        Long tk = puntosMapaVO.getTicket();
        BaseVO resultadoVO = new BaseVO();
        resultadoVO.setTicket(tk);
        Session session_db=null;
        try {
            String queryStr=QueryFactory.instance().query("puntosmapa_borrar", puntosMapaVO.getTicket());
            logParams[0] = queryStr;
            session_db = session();
            session_db.beginTransaction();

            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("idmapa", puntosMapaVO.getIdMapa());
            logParams[1] = puntosMapaVO.getIdMapa();

            logger.debug("Tiket={} Antes de ejecutar query", new Object[]{tk} );
            int intResult = query.executeUpdate();
            session_db.getTransaction().commit();
            resultadoVO.setCodigo(ConstantesDB.STATUS_OK);
        } catch (Exception e) {
            if(session_db!=null){
                session_db.getTransaction().rollback();
            }
            resultadoVO.setCodigo(ConstantesDB.STATUS_FAIL);
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} idmapa={} ", logParams);
        }
        return resultadoVO;
    }


}
